package com.hiss.basic.model.system.request;

import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.hiss.basic.model.system.domain.SysMenuDomain;
import com.hiss.basic.model.system.enums.MenuComponentTypeEnum;
import com.hiss.basic.model.system.enums.MenuTypeEnum;
import com.hiss.basic.starter.core.constant.PatternConstant;
import com.hiss.basic.starter.core.exception.BusinessException;
import com.hiss.basic.starter.core.helper.ValidationHelper;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import org.hibernate.validator.constraints.Range;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;
import java.io.Serializable;

/**
 * 系统菜单创建请求
 */
@Data
@AutoMapper(target = SysMenuDomain.class)
public class SysMenuCreateRequest implements Serializable {

    private static final long serialVersionUID = 1;

    /**
     * 菜单标题
     */
    @NotBlank(message = "菜单标题不能为空")
    private String title;

    /**
     * 路由名称
     */
    private String name;

    /**
     * 路由地址
     */
    private String path;

    /**
     * 组件路径
     */
    private String component;

    /**
     * 菜单图标
     */
    private String icon;

    /**
     * 权限标识
     */
    @Pattern(regexp = PatternConstant.AUTHORITY_PATTERN, message = "权限标识不符合 *:*:* 规范")
    private String authority;

    /**
     * 菜单类型
     *
     * @see com.hiss.basic.model.system.enums.MenuTypeEnum
     */
    @NotNull(message = "菜单类型不能为空")
    @Range(min = 0, max = 2, message = "非法菜单类型值")
    private Integer menuType;

    /**
     * 组件类型
     *
     * @see com.hiss.basic.model.system.enums.MenuComponentTypeEnum
     */
    @NotNull(message = "组件类型不能为空")
    @Range(min = 0, max = 2, message = "非法组件类型值")
    private Integer componentType;

    /**
     * 链接，配合内链 外链使用
     */
    private String link;

    /**
     * 父级菜单 ID
     */
    @NotNull(message = "父级菜单不能为空")
    private Long parentId;

    /**
     * 排序
     */
    @NotNull(message = "排序不能为空")
    private Integer sort;

    /**
     * 菜单启用状态
     *
     * @see com.hiss.basic.starter.core.enums.EnableStatusEnum
     */
    @NotNull(message = "启用状态不能为空")
    @Range(min = 0, max = 1, message = "非法启用状态值")
    private Integer enableStatus;

    /**
     * 缓存状态
     *
     * @see com.hiss.basic.model.system.enums.MenuCacheStatusEnum
     */
    @NotNull(message = "缓存状态不能为空")
    @Range(min = 0, max = 1, message = "非法缓存状态值")
    private Integer cacheStatus;

    /**
     * 隐藏状态
     *
     * @see com.hiss.basic.model.system.enums.MenuHiddenStatusEnum
     */
    @NotNull(message = "显示状态不能为空")
    @Range(min = 0, max = 1, message = "非法显示状态值")
    private Integer hiddenStatus;

    public static void validate(SysMenuCreateRequest request) {
        ValidationHelper.validate(request);

        // 如果是目录或者菜单，校验路由名称和路由地址
        if (ObjectUtil.equal(MenuTypeEnum.DIRECTORY.getCode(), request.getMenuType())
                || ObjectUtil.equal(MenuTypeEnum.MENU.getCode(), request.getMenuType())) {
            if (StrUtil.isBlank(request.getName())) {
                throw new BusinessException("路由名称不能为空");
            }
            if (StrUtil.isBlank(request.getPath())) {
                throw new BusinessException("路由地址不能为空");
            }
        }
        // 如果是菜单，并且是组件，校验组件路径
        if (ObjectUtil.equal(MenuTypeEnum.MENU.getCode(), request.getMenuType())
                && ObjectUtil.equal(MenuComponentTypeEnum.COMPONENT.getCode(), request.getComponentType())) {
            if (StrUtil.isBlank(request.getComponent())) {
                throw new BusinessException("组件路径不能为空");
            }
        }
        // 如果是目录或者是菜单，并且是内链或者外链，校验链接地址
        if ((ObjectUtil.equal(MenuTypeEnum.DIRECTORY.getCode(), request.getMenuType())
                || ObjectUtil.equal(MenuTypeEnum.MENU.getCode(), request.getMenuType()))
                && !ObjectUtil.equal(MenuComponentTypeEnum.COMPONENT.getCode(), request.getComponentType())) {
            if (StrUtil.isBlank(request.getLink())) {
                throw new BusinessException("链接地址不能为空");
            }
        }
    }
}
